package com.gitee.helioz.openai.common.util.json;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.util.Objects;

/**
 * 〈Gson〉
 *
 * <pre>
 * 根据 Google Gson 文档，Gson 是线程安全的。这意味着在多线程环境中，可以安全地同时访问和使用 Gson 实例，而无需额外的同步措施。
 * Gson 对象本身是线程安全的，因为 Gson 类的实现是无状态的，并且 Gson 对象在创建后是不可变的。因此，可以在多个线程中共享同一个 Gson 实例，而无需担心线程安全性问题。
 * 然而，如果在自定义序列化或反序列化过程中使用自定义的 TypeAdapter、JsonSerializer、JsonDeserializer 等 Gson 提供的扩展功能，这些自定义的代码可能会存在线程安全性问题。
 * 在这种情况下，需要自行确保在多线程环境中的正确使用，例如使用合适的同步措施来保护共享资源，或者避免在多线程环境中共享自定义的 Gson 扩展功能。
 * 总之，Gson 本身是线程安全的，但在使用自定义扩展功能时，需要注意线程安全性，并采取适当的措施来保护共享资源。
 * </pre>
 *
 * @author <a href="https://gitee.com/helioz">Morning Starr</a>
 */
public class OpenAiGsonBuilder {

    private static final GsonBuilder INSTANCE = new GsonBuilder();
    private static volatile Gson GSON_INSTANCE;

    static {
        // 禁用HTML转义
        INSTANCE.disableHtmlEscaping();
        // 设置日期格式
        INSTANCE.setDateFormat("yyyy-MM-dd HH:mm:ss");
    }

    public static Gson create() {
        if (Objects.isNull(GSON_INSTANCE)) {
            synchronized (INSTANCE) {
                if (Objects.isNull(GSON_INSTANCE)) {
                    GSON_INSTANCE = INSTANCE.create();
                }
            }
        }
        return GSON_INSTANCE;
    }

}
